unit utenti_frm;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics,
  Dialogs, StdCtrls, ExtCtrls, Soggetti_frm, ZDataset;

type

  { TUtenti }

  TUtenti = class(TForm)
    btaprisoggetti: TButton;
    btsalva: TButton;
    btelimina: TButton;
    btnuovo: TButton;
    cbsoggetti: TComboBox;
    cbutenti: TComboBox;
    chkadmin: TCheckBox;
    chkattivo: TCheckBox;
    edpassword: TLabeledEdit;
    edusername: TLabeledEdit;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    lblNote: TLabel;
    lblsoggetti: TLabel;
    zq_utenti: TZQuery;
    procedure btaprisoggettiClick(Sender: TObject);
    procedure bteliminaClick(Sender: TObject);
    procedure btnuovoClick(Sender: TObject);
    procedure btsalvaClick(Sender: TObject);
    procedure cbutentiChange(Sender: TObject);
    procedure cbutentiExit(Sender: TObject);
    procedure cbutentiKeyPress(Sender: TObject; var Key: char);
    procedure edusernameChange(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure LoadComboSoggetti();
    procedure LoadComboUtenti();
    procedure ClearCampi();
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Utenti: TUtenti;

implementation

{ TUtenti }

procedure TUtenti.FormCreate(Sender: TObject);
begin
  //seleziono tutte le ditte e le visualizzo nella combobox
  LoadComboUtenti();
  //seleziono tutte le aziende e popolo le combobox
  LoadComboSoggetti();
end;

procedure TUtenti.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CloseAction:=caFree;
end;


procedure TUtenti.btnuovoClick(Sender: TObject);
begin
  //pulisce tutti i campi per consentire un nuovo inserimento
  ClearCampi();
  cbsoggetti.SetFocus;
end;

procedure TUtenti.btsalvaClick(Sender: TObject);
begin
  //CONTROLLI
  if cbsoggetti.ItemIndex=-1 then
  begin
       ShowMessage('Devi selezionare un soggetto valido.');
       cbsoggetti.SetFocus;
       exit();
  end;
  if edusername.Text='' then
  begin
     ShowMessage('Devi indicare nome utente del soggetto.');
     edusername.SetFocus;
     exit();
  end;
  if edpassword.Text='' then
  begin
     ShowMessage('Devi indicare la password del soggetto.');
     edpassword.SetFocus;
     exit();
  end;
  if cbutenti.Text<>'' then
  begin
     ////////////////////////////////////////////////////////////////////
     ///             Modifica Utente
     ////////////////////////////////////////////////////////////////////
     with zq_utenti do
          begin
               Close;
               sql.Clear;
               sql.Add('UPDATE UTENTI SET '+
                       'IDSOGGETTO=:IDSOGGETTO,'+
                       'USERNAME=:USERNAME,'+
                       'PASS=:PASSWORD,'+
                       'AMMINISTRATORE=:ADMIN,'+
                       'ATTIVO=:ATTIVO '+
                       'WHERE IDUTENTE=:ID');
               ParamByName('IDSOGGETTO').AsInteger:=integer(cbsoggetti.Items.Objects[cbsoggetti.ItemIndex]);
               ParamByName('USERNAME').AsString:=edusername.Text;
               ParamByName('PASSWORD').AsString:=edpassword.Text;
               if chkadmin.Checked then
                   ParamByName('ADMIN').AsInteger:=1
               else
                   ParamByName('ADMIN').AsInteger:=0;
               if chkattivo.Checked then
                   ParamByName('ATTIVO').AsInteger:=1
               else
                   ParamByName('ATTIVO').AsInteger:=0;
               ParamByName('ID').AsInteger:=integer(cbUtenti.Items.Objects[cbUtenti.ItemIndex]);
               ExecSQL;
               //riaggiorna la lista delle ditte nelle combo
               LoadComboUtenti();
               //comunica l'esito positivo della modifica
               ShowMessage(cbsoggetti.Text+ ' è stato modificato correttamente.');
          end;
  end
  else
  begin
     ////////////////////////////////////////////////////////////////////
     ///              INSERIMENTO UTENTE
     ////////////////////////////////////////////////////////////////////
     with zq_utenti do
     begin
          Close;
          sql.Clear;
          sql.Add('INSERT INTO UTENTI ('+
                     'IDSOGGETTO,'+
                     'USERNAME,'+
                     'PASS,'+
                     'AMMINISTRATORE,'+
                     'ATTIVO'+
                     ') VALUES (:IDSOGGETTO,:USERNAME,:PASSWORD,:ADMIN,:ATTIVO)');
          ParamByName('IDSOGGETTO').AsInteger:=integer(cbsoggetti.Items.Objects[cbsoggetti.ItemIndex]);
          ParamByName('USERNAME').AsString:=edusername.Text;
          ParamByName('PASSWORD').AsString:=edpassword.Text;
          if chkadmin.Checked then
             ParamByName('ADMIN').AsInteger:=1
          else
              ParamByName('ADMIN').AsInteger:=0;
          if chkattivo.Checked then
             ParamByName('ATTIVO').AsInteger:=1
          else
              ParamByName('ATTIVO').AsInteger:=0;

          ExecSQL;
          //riaggiorna la lista delle ditte
          LoadComboUtenti();
          //comunica l'esito positivo dell'inserimento
          ShowMessage('L''utente per '+cbsoggetti.Text+' è stato creato.');
     end
   end;
   btnuovoClick(self);
end;

procedure TUtenti.bteliminaClick(Sender: TObject);
var
  buttonSelected : Integer;
begin

   //controllo che sia stata selezionato un utente sennò avverto
   //che è necessario selezionarne uno
   if cbUtenti.ItemIndex<>-1 then
   begin
      //chiede conferma e poi cancella il record
      buttonSelected := MessageDlg('Si sta per eliminare l''utente '+cbutenti.Text+'. Continuare?',mtInformation, mbOKCancel, 0);
      if buttonSelected = mrOK     then
      begin
           with zq_utenti do
           begin
                Close;
                sql.Clear;
                sql.Add('DELETE FROM UTENTI WHERE IDUTENTE=:ID');
                ParamByName('ID').AsInteger:=integer(cbUtenti.Items.Objects[cbUtenti.ItemIndex]);
                ExecSQL;
           end;
           //rilegge tutti gli utenti e li carica nelle combo
           LoadComboUtenti();
           //pulisce tutti i campi
           ClearCampi();
      end
   end
   else ShowMessage('Per eliminare un utente è necessario prima selezionarne una dalla lista.');
end;


procedure TUtenti.btaprisoggettiClick(Sender: TObject);
begin
  //Apro la form Soggetti
  Soggetti:=TSoggetti.create(self);
  Soggetti.showmodal;
  //ricarico la combo dei soggetti
  LoadComboSoggetti();
end;


procedure TUtenti.cbutentiChange(Sender: TObject);begin
   if cbUtenti.ItemIndex<>-1 then
   begin
        //mostro nei campi l'azienda selezionata
        with zq_utenti do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT * FROM UTENTI WHERE IDUTENTE=:ID');
             ParamByName('ID').AsInteger:=integer(cbUtenti.Items.Objects[cbUtenti.ItemIndex]);
             ExecSQL;
             Open;
             edusername.Text:=FieldByName('USERNAME').AsString;
             edpassword.Text:=FieldByName('PASS').AsString;
             cbsoggetti.ItemIndex:= cbsoggetti.Items.IndexOfObject(TObject(FieldByName('IDSOGGETTO').AsInteger));
             chkadmin.Checked:=FieldByName('AMMINISTRATORE').AsBoolean;
             chkattivo.Checked:=FieldByName('ATTIVO').AsBoolean;
        end;
   end;
end;

procedure TUtenti.cbutentiExit(Sender: TObject);
begin
  (sender as TComboBox).ItemIndex := (sender as TComboBox).Items.IndexOfObject(TObject((sender as TComboBox).Items.Objects[(sender as TComboBox).ItemIndex]));
  (sender as TComboBox).OnChange(self);
end;

procedure TUtenti.cbutentiKeyPress(Sender: TObject; var Key: char);
begin
   if key=#13 then
    SelectNext(sender as twincontrol,true,true);
end;


procedure TUtenti.edusernameChange(Sender: TObject);
begin
  btsalva.Enabled:=true;
end;


procedure TUtenti.LoadComboUtenti();
begin
//svuota combo
cbutenti.Clear;
with zq_utenti do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT ANAGSOGGETTI.NOME,ANAGSOGGETTI.COGNOME,UTENTI.IDUTENTE FROM ANAGSOGGETTI '+
                 'INNER JOIN UTENTI ON ANAGSOGGETTI.IDSOGGETTO=UTENTI.IDSOGGETTO');
             ExecSQL;
             Open;
             while not EOF do
             begin
                  cbutenti.Items.AddObject(FieldByName('NOME').AsString+' '+FieldByName('COGNOME').AsString,TObject(FieldByName('IDUTENTE').AsInteger));
                  Next;
             end;
        end
end;

procedure TUtenti.LoadComboSoggetti();
begin
//svuota combo
cbsoggetti.Clear;
with zq_utenti do
        begin
             Close;
             sql.Clear;
             sql.Add('SELECT IDSOGGETTO, NOME, COGNOME FROM ANAGSOGGETTI');
             ExecSQL;
             Open;
             while not EOF do
             begin
                  cbsoggetti.Items.AddObject(FieldByName('COGNOME').AsString+' '+FieldByName('NOME').AsString,TObject(FieldByName('IDSOGGETTO').AsInteger));
                  Next;
             end;
        end
end;

//la procedura svuota tutti i campi delle textbox e elimina la selezione nelle combo
procedure TUtenti.ClearCampi();
 begin
  cbutenti.ClearSelection;
  cbsoggetti.ClearSelection;
  edusername.Clear;
  edpassword.Clear;
  chkadmin.Checked:=false;
  chkattivo.Checked:=false;
  btsalva.Enabled:=false;
end;

initialization
  {$I utenti_frm.lrs}

end.

